# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-05-01
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
from 神笔码靓.码靓库.地理.地图数据 import 获取世界地图数据, 获取中国地图数据
from 神笔码靓.神笔库 import 神笔绘图板, 作品输出目录
from 神笔码靓.神笔库.通用工具集 import *
from 神笔码靓.神笔库.定义集 import *

文字调整 = {
    "UnitedStates": lambda 字, 位置, 高清图: (字.字体大小(8).平移(50, 50), 高清图.复制元素(对象元素=字, x=-150, y=-130)),
    "Canada": lambda 字, 位置, 高清图: 字.字体大小(8).平移(-50, 80),
    "Russia": lambda 字, 位置, 高清图: 字.字体大小(10).平移(0, 80),
    "China": lambda 字, 位置, 高清图: 字.字体大小(10).字符间距(3).平移(-10, 5),
    "FrenchSouthernandAntarcticLands": lambda 字, 位置, 高清图: 字.平移(0, 5),
    "Australia": lambda 字, 位置, 高清图: 字.字体大小(8).平移(0, -30),
}

背景颜色列表 = [
    "#FF1493", "#FF6347", "#FFB225", "#FFD700", "#A52A2A", "#8B4513", "#F4A460", "#C7B19B",
    "#E6E6FA", "#ADD8E6", "#A05D56", "#FF69B4", "#CD5C5C", "#F0E68C", "#E6E6FA", "#FFDAB9",
    "#800080", "#FF4500", "#DAA520", "#ADFF2F", "#FFFFE0", "#FFFACD", "#FFA07A", "#EEE8AA",
    "#DDA0DD", "#D2B48C", "#D19275", "#F5DEB3", "#FFE4E1", "#F5F5DC",
]

国家中文名 = {
    "China": "中华人民共和国"
}

国家区域颜色 = {
    "China": 颜色.红色
}


def 国家名调整(名称):
    if 名称 in 国家中文名:
        return 国家中文名[名称]
    区域名称拼接 = 列表()
    for 索引值, 字符 in 索引列举(名称):
        if 字符.isupper() and 索引值 > 0:
            # 首字母大写（第一个除外）前面加空格
            区域名称拼接.添加元素(' ')
        区域名称拼接.添加元素(字符)
    return ''.join(区域名称拼接)


def 获取国家颜色(国家名称):
    if 国家名称 in 国家区域颜色:
        return 国家区域颜色[国家名称]
    return None


世界高清地图数据 = 获取世界地图数据(是)
中国高清地图数据 = 获取中国地图数据(是)


def 构建地图():
    作品文件路径 = 作品输出目录("高清世界地图")
    神笔 = 神笔绘图板(作品文件路径=作品文件路径, 宽=1015, 高=660)
    # 高清图.设置背景色(背景色=颜色.亮海蓝色)
    # 高清图.显示图框()
    # 大海
    神笔.画矩形(x=0, y=0, 宽=神笔.宽, 高=神笔.高, 填充颜色="#0099CE")
    # 高清图.显示图框()
    颜色数 = len(背景颜色列表)
    国文字信息列表 = 列表()

    for 索引值, 国家 in 索引列举(世界高清地图数据):
        # if 国家.lower() in ["china"]:
        #     continue
        点列表 = 世界高清地图数据[国家]
        国家颜色 = 获取国家颜色(国家)
        if 国家颜色 is None:
            国家颜色 = 背景颜色列表[索引值 % 颜色数]

        国连线 = 神笔.连线(点列表, 描边宽度=0.2, 描边颜色=颜色.黑色, 填充颜色=国家颜色)
        # 省连线.阴影(偏移=(0.8, 0.8), 模糊度=0.5)
        位置信息 = 国连线.获取位置信息()
        国文字信息列表.添加元素((国家, 位置信息))

    中国区域 = 列表()

    for 省 in 中国高清地图数据:
        点列表 = 中国高清地图数据[省]
        省颜色 = 颜色.红色
        省连线 = 神笔.连线(点列表, 描边宽度=0.2, 描边颜色=颜色.黑色, 填充颜色=省颜色)
        中国区域.添加元素(省连线)

    # .平移(680.5, 285).缩放(0.2216)
    缩放X, 缩放Y, 平移X, 平移Y = 获取中国范围比和调整位置()
    神笔.创建组合(元素列表=中国区域).平移(平移X - 0.5, 平移Y - 0.5).缩放(缩放X, 缩放Y).立体阴影()

    for 国家, 位置信息 in 国文字信息列表:
        国家文字 = 神笔.写字(x=位置信息.中心x, y=位置信息.中心y, 文字=国家名调整(国家),
                     描边颜色=颜色.黑色, 描边宽度=0.05,
                     字体大小=4, 填充颜色=颜色.白色)
        国家文字.阴影(偏移=(0.4, 0.4), 模糊度=0.5)
        if 国家 in 文字调整:
            文字调整[国家](国家文字, 位置信息, 神笔)

    神笔.完成()


def 获取路径点列表范围(点列表):
    最小x = float('inf')
    最小y = float('inf')
    最大x = float('-inf')
    最大y = float('-inf')

    # ['M', 'm', 'L', 'l', 'H', 'h', 'V', 'v', 'C', 'c', 'S', 's', 'Q', 'q', 'T', 't', 'A', 'a', 'Z', 'z']
    for 点 in 点列表:
        if 点[0] in ["M", "m", "L", "l", "T", "t"]:
            顶点x, 顶点y = 点[1], 点[2]
        elif 点[0] in ["C", "c"]:
            # (x1, y1), (x2, y2), (x, y)
            顶点x, 顶点y = 点[5], 点[6]
        elif 点[0] in ["H", "h"]:
            顶点x = 点[1]
        elif 点[0] in ["V", "v"]:
            顶点y = 点[1]
        elif 点[0] in ["Q", "q", "S", "s"]:
            # (x1, y1), (x, y)
            顶点x, 顶点y = 点[3], 点[4]
        elif 点[0] in ["A", "a"]:
            # (rx, ry), x_axis_rotation, (large_arc_flag, sweep_flag), (x, y) =
            顶点x, 顶点y = 点[6], 点[7]
        elif 点[0] in ["Z", "z"]:
            pass
        else:
            顶点x, 顶点y = 点[0], 点[1]

        if 顶点x < 最小x:
            最小x = 顶点x
        if 顶点x > 最大x:
            最大x = 顶点x
        if 顶点y < 最小y:
            最小y = 顶点y
        if 顶点y > 最大y:
            最大y = 顶点y

    return 最小x, 最小y, 最大x, 最大y


def 获取中国范围比和调整位置():
    China列表 = 世界高清地图数据["China"]
    min_x, min_y, max_x, max_y = 获取路径点列表范围(China列表)
    width = max_x - min_x
    height = max_y - min_y
    最小x = float('inf')
    最小y = float('inf')
    最大x = float('-inf')
    最大y = float('-inf')
    for 省 in 中国高清地图数据:
        点列表 = 中国高清地图数据[省]
        最小x_, 最小y_, 最大x_, 最大y_ = 获取路径点列表范围(点列表)
        if 最小x_ < 最小x:
            最小x = 最小x_
        if 最大x_ > 最大x:
            最大x = 最大x_
        if 最小y_ < 最小y:
            最小y = 最小y_
        if 最大y_ > 最大y:
            最大y = 最大y_

    宽 = 最大x - 最小x
    高 = 最大y - 最小y
    # return (width / 宽 + height / 高) / 2, min_x, min_y
    # return height / 高, min_x, min_y
    return width / 宽, height / 高, min_x, min_y


if __name__ == '__main__':
    构建地图()
